<?php
	
/**
 * Базовый класс для модулей бота
 */
class BotModule {
	
	/**
     * Объект бота
     * 
     * @property object $Bot
     */
	private $Bot;
	
	/**
     * Входящее сообщение
     * 
     * @property string $input_message
     */
	private $input_message = '';
	
	/**
     * Команды
     * 
     * @property array $commands
     */
	private $commands = array();
	
	
	public function __construct(){
		$this->clearInputMessage();
	}
	
	public function clearInputMessage(){
		$this->input_message = array(
			'text' 		=> '',
			'from_conf' => '',
			'from_user' => '',
			'msg_type'  => '',
		);
	}
	
	/**
     * Объявить входящее сообщение
     * 
     * @param array $input_message
     */
	public function setInputMessage($input_message = array()){
		$this->input_message = $input_message;	
	}
	
	/**
     * Установить сообщение
     * 
     * @param object $Bot
     */
	public function setBot($Bot){
		$this->Bot = $Bot;	
	}
	
	/**
     * Процесс работы модуля, поиск команды
     * 
     * @param object $Bot
     */
	public function process(){
		if(!isset($this->input_message['text'])){
			// ошибка
			return;
		}
		// если команда найдена, отдаём на исполнение
		if(!is_null($found_command = $this->find($this->input_message['text']))){
			return $this->execute($found_command);
		}
		$this->clearInputMessage();
	}
	
	/**
     * Поиск команды по входящему сообщению
     * 
     * @param string $request
     */
	public function find($request)
    {
    	$found_command = array();
    	// перебираем команды
		foreach ($this->commands as $command){
			$matches = array();
			// если запрос соответствует шаблону команды
			if (preg_match('#^' . $command['pattern'] . '$#', $request, $matches)) {
				$found_command = $command;
				$found_command['params']      = array();
				// подменяем параметры в команде из запроса
				foreach ($command['params'] as $param) {
					// если параметр
					if (substr($param, 0, 1) == '$') {
						// заменем на параметр из запроса
						$found_command['params'][] = $matches[substr($param, 1)];
					} else {
						// оставляем без изменений
						$found_command['params'][] = $param;
					}
				}
				return $found_command;
			}
		} 
		// команда не найдена
        return null;
    } 
    
	/**
     * Выполнить найденную команду
     * 
     * @param array $found_command
     */
    public function execute($found_command)
    {
    	if(!is_null($found_command)){
        	return call_user_func_array(array($found_command['object'], $found_command['function_name']), $found_command['params']);
    	} else {
    		// ошибка
    		return null;
    	}
    }
    
	/**
     * Объявить команду
     * 
     * @param array $command
     */
	public function setCommand($command, $id = null){
		if(!is_null($id)){
    		$this->commands[$id] = $command;
		} else {
			$this->commands[] = $command;
		}
	}
	
	public function setCommandsArray(){

	}
	
	/**
     * Отправить сообщение
     * 
     * @param string $text
     */
    public function sendMessage($text){
    	$this->Bot->message(
    		$this->input_message['from_conf'], 
    		trim($this->input_message['from_user'].' '. $text), 
    		$this->input_message['msg_type']
    	);
    }
    
	/**
     * Отправить сообщение
     * 
     * @param string $text
     */
    public function sendMessageToConderence($text){
    	$this->sendMessage($text);
    }
}